package ar.org.cfired.creditos.gui;

import org.jbpm.api.ExecutionService;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import java.util.Vector;

/**
 * Mantiene la bandeja actual a mostrar para una sesi&oacute;n.
 * @author Rogelio Di Pasquale - Revolution BPM
 * */
public class ContenedorTareas {
  private ExecutionService executionService;
  private List<Tarea> tareas;
  private List<Integer> tareasOrdenadas;
  private int arreglo[];
  private String columnaActual;
  private char ordenActual;
  public static final char ORDEN_ASCENDENTE = 'A';
  public static final char ORDEN_DESCENDENTE = 'D';
  private List<String> nombresColumnas;
  private List<String> columnas;

  /**
   * Constructor
   */
  public ContenedorTareas(ExecutionService executionService) {
	  this.setExecutionService(executionService);
	  tareasOrdenadas = new ArrayList<Integer>();
	  tareas = new ArrayList<Tarea>();
	  nombresColumnas = new ArrayList<String>();
	  columnas = new ArrayList<String>();
  }
  
  /**
   * Setea el Execution Service
   * @param executionService ExecutionService
   * */
  public void setExecutionService(ExecutionService executionService) {
	  this.executionService = executionService;
  }
  /**
   * Devuelve el Execution Service
   * */
  public ExecutionService getExecutionService() {
	  return(this.executionService);
  }
  /**
   * Agrega una tarea al listado. No hace falta que se hayan buscado los
   * datos de la misma, ya que se buscar&acute;n para ser ordenados por primera vez.
   * Todas las tareas que se agreguen deben tener los mismos par&aacute;metros.
   * @param tarea
   */
  public void addTarea(Tarea tarea) {
	  /*if (columnas.size()<0) {
		  for (int i = 0; i<columnas.size(); i++)
			  tarea.addCampo(columnas.get(i));
	  }*/
	  tarea.buscar(this.executionService);
	  tareas.add(tarea);
  }
  /**
   * Borra el listado de tareas
   */
  public void limpiarTareas() {
	  tareas = new ArrayList<Tarea>();
  }

  public void setColumnaActual(String columna) {
	  this.columnaActual = columna;
  }
  public String getColumnaActual() {
	  return(this.columnaActual);
  }
  public void setOrdenActual(char orden) {
	  this.ordenActual = orden;
  }
  public char getOrdenActual() {
	  return (this.ordenActual);
  }
  
  private void ordenar(String columna, char orden) {
	  if (columna != null) {
			this.tareasOrdenadas = new ArrayList<Integer>();
			this.setColumnaActual(columna);
			this.setOrdenActual(orden);
			Vector<String> v = new Vector<String>();
			arreglo = new int[this.tareas.size()];
			for (int i = 0; i<this.tareas.size(); i++) {
				if (columna.equals(Tarea.ESTADO) || columna.equals(Tarea.DUENO)) {
					if (columna.equals(Tarea.ESTADO)) v.add(this.tareas.get(i).getEstadoTarea());
					if (columna.equals(Tarea.DUENO)) v.add(this.tareas.get(i).getDuenoTarea());
				}
				else
					v.add(this.tareas.get(i).getColumna(columna));
				arreglo[i]=i;
			}
			int criterio;
			criterio = ((this.ordenActual==ORDEN_ASCENDENTE)?1:-1);
			
			String aux;
			int aux_int;
			for (int i = 0; i<v.size()-1; i++) {
				for (int j = i + 1; j<v.size(); j++) {
					if (Integer.signum(v.get(i).compareToIgnoreCase(v.get(j))) == criterio ) {
						aux = v.get(i);
						aux_int = arreglo[i];
						v.set(i, v.get(j));
						arreglo[i] = arreglo[j];
						v.set(j, aux);
						arreglo[j] = aux_int;
					}
				}
			
	  } 
	}
 }
  
  public String toHTML(String columna, char orden, int pagina, int cantidadPorPagina){
	  String res = "";
	  
	  Integer cantidadPaginas = new Double( Math.ceil(Float.valueOf(tareas.size()) / Float.valueOf(cantidadPorPagina)) ).intValue();
	  
	  if (!columna.equals(this.columnaActual) || orden != this.ordenActual)
		  this.ordenar(columna, orden);
	  	  
	  for (int i = cantidadPorPagina * pagina; (i<cantidadPorPagina * (pagina+1)) && i<tareas.size(); i++) {
		  res += this.tareas.get(arreglo[i]).toHtml() + "\n";
	  }
	  //res += "<td colspan=5>Documentos " + (cantidadPorPagina * pagina) + " al " + Math.min(cantidadPorPagina*(pagina+1), tareas.size()) + " de " + tareas.size() + " documento(s)</td>\n";
		 res += "<tr>";
		 res += "	<td align\"center\" colspan=\"5\">";
		 res += "   	<table width=\"100%\" border=\"0\">";
		 res += "			<tr>"; 
		 res += "				<td align=\"left\"><input id=\"btnpIzquierda\" onClick=\"paginaNumero(0);\" type=\"image\" src=\"img/tIzquierda.png\"></td>";
		 res += "				<td align=\"left\"><input id=\"btnIzquierda\" onClick=\"paginaNumero(" + ((pagina>0)?pagina-1:0) + ");\" type=\"image\" src=\"img/izquierda.png\"></td>";
		 res += "				<td>" + Math.min((cantidadPorPagina * pagina + 1), tareas.size()) + " al " + Math.min(cantidadPorPagina*(pagina+1), tareas.size()) + " de " + tareas.size() + " documento(s)</td>";		
		 res += "				<td align=\"right\"><input id=\"btnDerecha\" onClick=\"paginaNumero(" + ((pagina<cantidadPaginas-1)?(pagina+1):cantidadPaginas - 1) + ");\" type=\"image\" src=\"img/derecha.png\"></td>";
		 res += "				<td align=\"right\"><input id=\"btnpDerecha\" onClick=\"paginaNumero(" + (cantidadPaginas - 1) + ");\" type=\"image\" src=\"img/tDerecha.png\"></td>";
		 res += "			</tr>";
		 res += "   	</table>";
		 res += "	</td>";
		 res += "</tr>";
	  return(res);
  }
  
  public void addColumna(String nombre, String variable) {
	  nombresColumnas.add(nombre);
	  columnas.add(variable);
  }
  
	public String getEncabezado() {
		 String str = "";
		 str += "<tr>";
		 str += "<td class=\"icono\"></td>";
		 
		   for (int i = 0; i<nombresColumnas.size(); i++) {
			  str += "<td class=\"columna\">" + nombresColumnas.get(i) + "&nbsp;";
		 	  str += "<input type=\"image\" src=\"img/abajo.png\" onClick=\"ordenarPor('" + columnas.get(i) + "', '" + ContenedorTareas.ORDEN_DESCENDENTE + "');\">";
		 	  str += "<input type=\"image\" src=\"img/arriba.png\" onClick=\"ordenarPor('" + columnas.get(i) + "', '" + ContenedorTareas.ORDEN_ASCENDENTE + "');\"></td>";
		   }
		 
		 str += "</tr>";
		 return (str);
	}
	
  
}
